package algorithm.middle;

/**
 * @author 江岸
 * @version V1.0
 * @ClassName: MaxSatisfied1052
 * @description: 今天，书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客（customers[i]）会进入书店，所有这些顾客都会在那一分钟结束后离开。
 *
 * 在某些时候，书店老板会生气。 如果书店老板在第 i 分钟生气，那么 grumpy[i] = 1，否则 grumpy[i] = 0。 当书店老板生气时，那一分钟的顾客就会不满意，不生气则他们是满意的。
 *
 * 书店老板知道一个秘密技巧，能抑制自己的情绪，可以让自己连续 X 分钟不生气，但却只能使用一次。
 *
 * 请你返回这一天营业下来，最多有多少客户能够感到满意的数量。
 *
 *
 * 示例：
 *
 * 输入：customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3
 * 输出：16
 * 解释：
 * 书店老板在最后 3 分钟保持冷静。
 * 感到满意的最大客户数量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/grumpy-bookstore-owner
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @date 2021/2/2310:53
 * @since V1.0
 */

public class MaxSatisfied1052 {

    public static void main(String[] args) {
        int[] customers = {3};
        int[] grumpy = {1};
        System.out.println(maxSatisfied(customers,grumpy,1));
    }
    //滑动窗口
    public static int maxSatisfied(int[] customers, int[] grumpy, int X) {
        //前X位的计数
        int count = 0;
        for (int n=0;n<X;n++){
            count = count + customers[n]*grumpy[n];
        }
        int max = count;
        //寻找最大生气区间
        for (int i=1;i<=customers.length-X;i++){
            count = count - customers[i-1]*grumpy[i-1] + customers[i+X-1]*grumpy[i+X-1];
            if (count>max){
                max = count;
            }
        }
        int res = 0;
        //优化 使用「秘密技巧」能得到的最终的顾客数 = 所有不生气时间内的顾客总数 + 在窗口 X 内使用「秘密技巧」挽留住的原本因为生气而被赶走顾客数。
        for (int i=0;i<customers.length;i++){
            if (grumpy[i]==0){
                res = res + customers[i];
            }
        }
        res = res + max;
        return res;
    }

}
